package com.neusoft.tijian.service.impl;

import com.neusoft.tijian.dto.CalendarRequestDto;
import com.neusoft.tijian.dto.CalendarResponseDto;
import com.neusoft.tijian.dto.OrdersMapperDto;
import com.neusoft.tijian.mapper.CalendarMapper;
import com.neusoft.tijian.mapper.HospitalMapper;
import com.neusoft.tijian.mapper.OrdersMapper;
import com.neusoft.tijian.service.CalendarService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

@Service
public class CalendarServiceImpl implements CalendarService {
	@Autowired
	private OrdersMapper ordersMapper;
	@Autowired
	private HospitalMapper hospitalMapper;
	private CalendarMapper calendarMapper;
	//生成预约日历
	@Override
	public List<CalendarResponseDto> listAppointmentCalendar(CalendarRequestDto dto) {
		//获取预约日期列表

		//获取当前日历（当前日历中只有ymd属性，total、existing、remainder需要从calendarList30获取）

		//给当前日历填充total、existing、remainder属性
		//使用嵌套的循环遍历当前日历列表和预约日期列表，通过比较日期（ymd属性）来找到匹配的日期，
		//并将对应的total、existing和remainder属性填充到当前日历对象中。

		return calendarMapper.listAppointmentCalendar(dto);
	}


	/**
	 * 生成一个包含当前日期及后续30天的万年历列表，并计算每天的总预约人数和剩余预约人数
	 * 思路：
	 * 1. 首先创建了一个SimpleDateFormat对象，用于将日期格式化为"yyyy-MM-dd"的字符串。然后，它获取了当前的Calendar实例。
	 *
	 * 2. 方法创建了一个临时集合parameList，用于存储查询Orders表所需的参数。通过循环30次，每次循环增加一天，
	 * 并将日期和hpId添加到OrdersMapperDto对象中，然后将该对象添加到parameList中。
	 *
	 * 3. 方法使用parameList作为参数，查询了Orders表中30天预约日期的已预约人数。查询结果存储在calendarList30中，
	 * 每个元素是一个CalendarResponseDto对象，其中包含ymd（预约日期）和existing（已预约人数）属性。
	 *
	 * 4. 方法从hospitalMapper中获取了医院编号为hpId的预约规则，并将规则字符串拆分为一个字符串数组strArr。
	 *
	 * 5. 方法通过循环遍历calendarList30，将预约日期转换为Calendar对象，并根据预约规则数组strArr获取每天的总预约人数。
	 * 然后，方法填充了每个CalendarResponseDto对象的total（总预约人数）和remainder（剩余预约人数）属性。
	 *
	 * 6. 方法返回了填充完毕的calendarList30列表。
	 * @param hpId
	 * @return
	 */
	private List<CalendarResponseDto> getCalendarList30(Integer hpId){
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		Calendar calendar = Calendar.getInstance();

		List<OrdersMapperDto> paramList = new ArrayList<>();
		List<CalendarResponseDto> calendarList = new ArrayList<>();
		for (int i = 0; i < 30; i++) {
			OrdersMapperDto ordersMapperDto = new OrdersMapperDto();
			Date date = calendar.getTime();
			String formattedDate = sdf.format(date);
			calendar.add(Calendar.DATE,1);
			ordersMapperDto.setDate(formattedDate);
			ordersMapperDto.setHpId(hpId);
			paramList.add(ordersMapperDto);
		}
		List<CalendarResponseDto> existingList = ordersMapper.listAppointmentCalendarNumber(paramList);
		List<String> strArr = hospitalMapper.getRuleById(hpId);

		return null;
	}
	


	/**
	 * 获取当前年和当前月的日历
	 *
	 * 思路：
	 * 1. 根据给定的年份（year）和月份（month），生成一个当前月份的万年历（CalendarResponseDto列表）。
	 *
	 * 2. 首先判断给定的年份是否为闰年，通过判断年份是否满足闰年的条件来确定（即：能被4整除但不能被100整除，或者能被400整除）。
	 * 如果是闰年，则将布尔变量isRun设置为true。
	 *
	 * 3. 计算从1900年1月1日到给定年份的总天数。通过一个循环，遍历从1900年到给定年份之间的每一年，
	 * 根据是否为闰年来累加相应的天数（366天或365天）。
	 *
	 * 4. 之计算给定月份前的天数。通过一个循环，遍历从1月到给定月份之前的每一个月，
	 * 根据月份的天数规律（1、3、5、7、8、10、12月有31天，4、6、9、11月有30天，2月根据是否为闰年有28或29天），
	 * 累加相应的天数。
	 *
	 * 5. 最后根据计算得到的总天数，确定给定月份的第一天是星期几。将星期几的值转换为一个整数（0表示星期日，1表示星期一，依次类推），
	 * 并将其存储在变量firstDayOfMonth中。
	 *
	 * 6. 然后根据firstDayOfMonth的值，在当前月份的万年历列表currentCalendar中添加相应数量的空日期（CalendarResponseDto对象）。
	 *
	 * 7. 最后通过一个循环，从1号到当前月份的最后一天，生成日期字符串（格式为"年-月-日"），并将其添加到currentCalendar中。
	 * @param year
	 * @param month
	 * @return
	 */
	private List<CalendarResponseDto> getCurrentCalendarList(Integer year, Integer month){
		return null;
	}

}
